﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.Support;

namespace Noris.Tools.TraceVisualiser.Components
{
	/// <summary>
	/// Interface, ze kterého je možno importovat / exportovat layout grafu (šířka sloupců, výška záhlaví).
	/// </summary>
    public interface IGraphLayout
    {
		int HeaderTop { get; set; }
		int HeaderHeight { get; set; }
		int HeaderFilterHeight { get; set; }
		List<int> WidthList { get; set; }
    }
    /// <summary>
    /// Interface, který specifikuje, že daný objekt může v sobě uchovávat pointer na místo v grafu + textové informace
    /// </summary>
    public interface ITextGraphPointer : IGraphPointer
    {
        /// <summary>
        /// Popisek události, krátká informace (první sloupec)
        /// </summary>
        string Info { get; set; }
        /// <summary>
        /// Popisek události, řádkový text (druhý sloupec)
        /// </summary>
        string Text { get; set; }
        /// <summary>
        /// Popisek události, odstavcový text
        /// </summary>
        string TooltipText { get; set; }
    }
    /// <summary>
    /// Interface, který specifikuje, že daný objekt může v sobě uchovávat pointer na místo v grafu
    /// </summary>
    public interface IGraphPointer
    {
        /// <summary>
        /// Časový interval
        /// </summary>
        TimeRange Time { get; set; }
		/// <summary>
		/// Řádkový filtr
		/// </summary>
		RowFilter RowFilter { get; set; }
        /// <summary>
        /// Seznam nodů, které jsou otevřené (ostatní nody jsou zavřené)
        /// </summary>
        IEnumerable<string> ExpandedNodes { get; set; }
        /// <summary>
        /// Požadavek na zavření nodů, které nejsou explicitně otevírané (nejsou uvedeny v ExpandedNodes)
        /// </summary>
        bool CollapseOtherNodes { get; set; }
        /// <summary>
        /// První viditelný node = v prvním řádku
        /// </summary>
        string FirstVisibleNode { get; set; }
		/// <summary>
		/// První viditelný pixel řádku FirstVisibleNode.
		/// Řádek nemusí být viditelný celý - zde je uveden první pixel (relativní k souřadnici Y = 0 = Top daného řádku), který je vidět.
		/// </summary>
		int FirstVisiblePixel { get; set; }
        /// <summary>
        /// Selectovaný řádek. Může být empty, pak se nebude měnit.
        /// </summary>
        string SelectedNode { get; set; }
    }
	/// <summary>
	/// Interface, který umožní objektu vyjádřit jeho názor na případné přenechání focusu
	/// </summary>
	internal interface ILeaveFocus
	{
		/// <summary>
		/// Property, která vyjadřuje, zda control může přenechat focus někomu jinému, kdo o to požádá
		/// </summary>
		bool CanLeaveFocus { get; }
		/// <summary>
		/// Metoda, po které si cizí control převezme focus
		/// </summary>
		void TakeAwayFocus();
	}
}
